import { sm4 } from 'sm-crypto';
import { Buffer } from 'buffer';

const SM4_KEY = '0123456789abcdeffedcba9876543210'; // 32位十六进制密钥
const SM4_IV = '0123456789abcdeffedcba9876543210';  // 32位十六进制IV (CBC模式需要)

/**
 * SM4 CBC模式加密
 * @param {string} plainText 明文
 * @param {string} key Hex编码的密钥
 * @param {string} iv Hex编码的IV
 * @returns {string} Base64编码的密文
 */
export function encryptSM4_CBC_ToBase64(plainText, key = SM4_KEY, iv = SM4_IV) {
  try {
    const cipherText = sm4.encrypt(plainText, key, {
      iv: iv,
      mode: 'cbc',       // cbc模式
      padding: 'pkcs#7', 
    });

    // 将Hex字符串转换为Buffer (字节数组)
    const cipherTextBytes = Buffer.from(cipherText, 'hex');

    // 将Buffer (字节数组) 转换为Base64字符串
    const cipherTextBase64 = cipherTextBytes.toString('base64');
    return cipherTextBase64
  } catch (error) {
    console.error('SM4 encryption error:', error);
    throw error; // 或者返回 null/特定错误信息
  }
}

// 如果你需要从 Base64 解密（虽然本例是后端解密，但前端也可以有解密需求）
/**
 * SM4 CBC模式解密 (从Base64)
 * @param {string} cipherTextBase64 Base64编码的密文
 * @param {string} key Hex编码的密钥
 * @param {string} iv Hex编码的IV
 * @returns {string} 明文
 */
export function decryptSM4_CBC_FromBase64(cipherTextBase64, key = SM4_KEY, iv = SM4_IV) {
  try {
    const plainText = sm4.decrypt(cipherTextBase64, key, {
      iv: iv,
      mode: 'cbc',
      padding: 'pkcs#7',
      input: 'base64' // 指明输入是base64
    });
    return plainText;
  } catch (error) {
    console.error('SM4 decryption error:', error);
    throw error;
  }
}